/* 
1. interface 定义一个新的引用数据类型
2. type是为已有的基本类型或引用类型取别名，并没有定义新的类型
3. 一般开发中对象类型用 interface 定义，数组类型用 type, type也可以定义基本类型
4. 扩展
● type 声明的类型不能重名，interface 声明的重命名会声明合并；
● 两者继承扩展的方式不同；
  ○ interface 使用 extends 继承
  ○ type 使用 & 关键字
*/

interface Product {
  name: string;
  price: number;
}

type Products = Product[]

const p: Product = {
  name: 'A',
  price: 12
}

const ps: Products = [
  p,
  // {}
]

// type 声明的类型不能重名，interface 声明的重命名会声明合并；
type Key = string|number
// type Key = string
interface Product {
  addr: string
}

const p2: Product = {
  name: 'A',
  price: 12,
  addr: 'bbb'
}

/* 
两者继承扩展的方式不同；
  ○ interface 使用 extends 继承
  ○ type 使用 & 关键字
*/

interface GoodProduct extends Product{
  xxxx: string;
}
type Name = {
  name: string
}
const n: Name = {
  name: 'abc'
}
type User = Name & {
  age: number
}
const u: User = {
  name: 'a',
  age: 12
}